const crypto = require('crypto')
const formidabel = require('formidable')
const path =require('path')
const secret = 'hyssyh'
const {
   isUserExist,
   saveOneUser
}=require('../model/userModel')
const register=(req,resp)=>{
   const form =new formidabel.IncomingForm()
   //文件存储位置
   console.log(__dirname)
   form.uploadDir=path.resolve(__dirname,'../public/static/images') 
   //保留后缀名
   form.keepExtensions = true
   //把文件存入uploadDir目录
   form.type = true
   //解析表单数据
   form.parse(req, function(err, fields, files) {
      console.log(fields)
      const imgpath = files.avatar.path
      const { base }=path.parse(imgpath)
      //根据文件名拼接完成文件路径
      const avatar = '/static/images/'+base
      //拿到前端传递过来的用户名和密码,在request对象上拿
      const { username,password }=fields
      isUserExist({username}).then(()=>{
         //代表有数据，用户名冲突
         false.unlink(path.resolve(__dirname,'../public/static/images/'+base),(err)=>{
            if (err) throw err
            else console.log('deleted')
               resp.json({
                  code:201,
                  body:{
                     msg:'用户名已存在'
                  }
            })
         })
   }).catch(()=>{
      //不冲突，存数据
      let hash =  crypto.createHmac('sha256', secret) .update('password').digest('hex');
      saveOneUser({ username,password: hash, avatar }).then(()=>{
         resp.json({
            code:200,
            body:{
               msg:'注册成功',
               userinfo:{
                  displayName:username,
                  src:avatar
               }
            }
         })
      }).catch(()=>{
         resp.json({
            code:202,
            body:{
            msg:'网络错误，请重试！'
            }
         })
      })
   }) 
 }) 
}
const login=(req,resp)=>{
   const { username,password } = req.body
   let hash =  crypto.createHmac('sha256', secret) .update('password').digest('hex');
   isUserExist({username,password:hash}).then((doc)=>{
      //数据成功查询到了，登录成功
      //存session
      req.session = {
         username,
         isLogin:true,
         avatar:doc.avatar
      }//在这里只要把session存下来，就会自动根据key计算出一个随机字符串并且发送给前端，
      //并且自动存前端cookie
      resp.json({
         code:200,
         body:{
            msg:'登录成功',
            userinfo:{
               displayName:username,
            }
         }
      })
   }).catch(()=>{
      resp.json({
         code:201,
         body:{
            msg:'用户名或密码错误'
         }
      })
   })
}
const isLogin=(req,resp)=>{
   //接受来自前端的token,跟之前存的session比对，
   //如果比对成功就可以在req.session里面拿到(中间件自动完成)
   if(req.session.isLogin){
      const {username,isLogin,avatar}=req.session
      resp.json({
         code:200,
         body:{
            username,
            isLogin,
            msg:'已登录',
            avatar
         }
      })
   }else{
      resp.json({
         code:201,
         body:{
            msg:'未登录，请先登录'
         }
      })
   }
}
const logout=(req,resp)=>{
   //删除session,退出登录
   req.session = null;
   resp.json({
      code:200,
      body:{
         msg:'退出成功'
      }
   })
}
module.exports={
   register,
   login,
   isLogin,
   logout
}